// 2022.09.17

// 颠倒给定的 32 位无符号整数的二进制位。

/**
 * @param {number} n - a positive integer
 * @return {number} - a positive integer
 */
var reverseBits = function (n) {
    let rev = 0;
    for (let i = 0; i < 32; i++) {
        rev |= (n & 1) << (31 - i)
        n >>>= 1
    }
    return rev >>> 0
};

// 1、无符号右移 >>>：左边补0，为非负数（右移的多余位将被丢弃，值为零的比特将从左侧移入）
// 2、有符号右移 >>：左边补符号位（右边移出位被丢弃，左边移出的空位补符号位（最左边那位））
// 3、无符号左移 <<：右边补0（左移的多余位将被丢弃，值为零的比特将从右侧移入）

/* 
4、>>> 0
    移位0位主要就是用了js的内部特性做了前两种转换：第一将不是number类型的数据转换为number，第二将number转换为无符号的32bit数据

    在JS中无论是整数还是小数都是按照64位的浮点数形式存储，而整数运算会自动转化为32位有符号整数。有符号整数使用 31 位表示整数的数值，用第 32 位表示整数的符号，0 表示正数，1 表示负数，所以数值范围为 [-2^31 , 2^31-1]。

    对于数值不在[-2^31 , 2^31-1]这个范围的数字不操作的情况下，是无符号整型，但是一旦进行了位运算，这个数字就转化成了32位有符号整型。

    JavaScript 不会定义不同类型的数，比如整型、长整型、浮点数等等。JavaScript 数值始终以双精度浮点数来存储，根据国际 IEEE 754 标准。

    https://juejin.cn/post/6882240762915323912/
*/